#include <iostream>
#include <unistd.h>
#include <signal.h>

void handler(int signal)
{
    std::cout << "signal: " << signal << std::endl;
}

void PrintPending(const sigset_t &pending)
{
    for(int signo = 31; signo > 0; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

int main()
{
    std::cout << "pid: " << getpid() << std::endl;
    signal(2, handler);

    // 1. 屏蔽2号信号
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);
    sigaddset(&set, 2);
    sigprocmask(SIG_BLOCK, &set, &oset);

    // 2. 让进程不断获取当前进程的pending表
    int cnt = 0;
    sigset_t pending;
    while(true)
    {
        sigpending(&pending);
        PrintPending(pending);

        sleep(1);
        cnt++;
        if(cnt==10)
        {
            std::cout << "解除对2号信号的屏蔽，2号信号准备递达" << std::endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr);
        }
    }

    // signal(2, handler);

    // sigset_t block, oblock;
    // // 初始化信号集
    // sigemptyset(&block);
    // sigemptyset(&oblock);
   
    // sigaddset(&block, 2);    // 将2号信号添加进信号集
    // sigprocmask(SIG_BLOCK, &block, &oblock);    // 屏蔽2号信号
    // while(true)
    // {
    //     std::cout << "I am running..." << std::endl;
    //     sleep(1);
    // }
    
    return 0;
}